package com.wande.dataplatform.service;

import com.wande.common.mybatis.core.page.PageQuery;
import com.wande.common.mybatis.core.page.TableDataInfo;
import com.wande.dataplatform.domain.dto.ImpactAnalysisDTO;
import com.wande.dataplatform.domain.dto.MetadataQueryDTO;
import com.wande.dataplatform.domain.vo.DataLineageVO;
import com.wande.dataplatform.domain.vo.MetadataVO;

import java.util.List;

/**
 * 元数据服务接口
 *
 * @author wande
 */
public interface IMetadataService {

    /**
     * 查询元数据列表
     *
     * @param queryDTO 查询条件
     * @param pageQuery 分页参数
     * @return 元数据列表
     */
    TableDataInfo<MetadataVO> queryMetadataList(MetadataQueryDTO queryDTO, PageQuery pageQuery);

    /**
     * 查询元数据详情
     *
     * @param id 元数据ID
     * @return 元数据详情
     */
    MetadataVO getMetadataById(Long id);

    /**
     * 采集数据源元数据
     *
     * @param datasourceId 数据源ID
     * @return 采集数量
     */
    Integer collectMetadata(Long datasourceId);

    /**
     * 采集指定表的元数据
     *
     * @param datasourceId 数据源ID
     * @param databaseName 数据库名
     * @param tableName 表名
     * @return 元数据ID
     */
    Long collectTableMetadata(Long datasourceId, String databaseName, String tableName);

    /**
     * 搜索元数据
     *
     * @param keyword 关键字
     * @param pageQuery 分页参数
     * @return 元数据列表
     */
    TableDataInfo<MetadataVO> searchMetadata(String keyword, PageQuery pageQuery);

    /**
     * 导出元数据
     *
     * @param queryDTO 查询条件
     * @return 导出数据
     */
    List<MetadataVO> exportMetadata(MetadataQueryDTO queryDTO);

    /**
     * 导入元数据
     *
     * @param metadataList 元数据列表
     * @return 导入数量
     */
    Integer importMetadata(List<MetadataVO> metadataList);

    /**
     * 删除元数据
     *
     * @param id 元数据ID
     * @return 是否成功
     */
    Boolean deleteMetadata(Long id);

    /**
     * 批量删除元数据
     *
     * @param ids 元数据ID列表
     * @return 是否成功
     */
    Boolean batchDeleteMetadata(List<Long> ids);

    /**
     * 构建数据血缘关系
     *
     * @param taskId 任务ID
     * @param taskType 任务类型
     * @return 是否成功
     */
    Boolean buildLineage(Long taskId, String taskType);

    /**
     * 查询上游依赖
     *
     * @param tableId 表ID
     * @return 上游血缘列表
     */
    List<DataLineageVO> getUpstream(Long tableId);

    /**
     * 查询下游影响
     *
     * @param tableId 表ID
     * @return 下游血缘列表
     */
    List<DataLineageVO> getDownstream(Long tableId);

    /**
     * 影响分析
     *
     * @param tableId 表ID
     * @param changeType 变更类型
     * @return 影响分析结果
     */
    ImpactAnalysisDTO analyzeImpact(Long tableId, String changeType);

    /**
     * 查询血缘关系图数据
     *
     * @param tableId 表ID
     * @param depth 深度(默认2层)
     * @return 血缘图数据
     */
    Object getLineageGraph(Long tableId, Integer depth);
}
